home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
051-075
/
069
/
mouseclock
/
mouseclock.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-13
|
9KB
|
333 lines
/*
* MouseClock - Turn your mouse pointer into a digital clock which
* updates once a minute.
*
* NOTE: This program directly modifies the preferences data structure.
* Using this program while trying to modify your preferences may
* have bad results.
*
* Copyright (c) 1986, 1987 John R. Hoffman
*
* To use MouseClock, just Run it from your Startup-Sequence. To stop
* it just delete the window and the previous pointer will be restored.
*
* This program is placed in the public domain as long as the above
* copyright is included. Sale of this program except for REASONABLE
* media costs is prohibited.
*
* To create with MANX: cc MouseClock.c
* ln MouseClock.o -lc
*
* Error codes:
*
* 0 - Normal exit.
* 101 - Can't get intuition.
* 102 - Can't create a timer port.
* 103 - Can't open a timer device.
* 104 - Can't open a window.
*
* Modification History:
*
* 11/03/86 John Hoffman - Original version.
* 01/02/87 John Hoffman - Added call to set task priority to -5,
* fixed hot point location,
* fixed to work with 16 bit integers,
* added code to adjust update time to
* five seconds after the minute.
*
*/
static char *Copyright = "Copyright (c) 1986, 1987 John R. Hoffman";
/* #define PRINT_ERRORS */
#ifdef PRINT_ERRORS
#include <stdio.h>
#endif
#include <exec/types.h>
#include <libraries/dos.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
/* The pointer image. */
static USHORT Clock[] = {
0x0000, 0x0000, 0xf800, 0xf800, 0xe000, 0xe000, 0xb000, 0xb000,
0x9800, 0x9800, 0x0c00, 0x0c00, 0xfffe, 0xfffe, 0x0000, 0xfffe,
0xb8ee, 0xfffe, 0xa8aa, 0xfffe, 0xaaaa, 0xfffe, 0xb8ee, 0xfffe,
0xaaaa, 0xfffe, 0xa8aa, 0xfffe, 0xb8ee, 0xfffe, 0x0000, 0xfffe,
0xfffe, 0xfffe, 0x0000, 0x0000
};
/* The hot point offset for the pointer. */
#define CLOCK_HOT_X -1
#define CLOCK_HOT_Y 0
/* The positions in the pointer image which are replaced. */
static USHORT positions[] = { 16, 18, 20, 22, 24, 26, 28 };
/* The number of positions. */
#define NUMPOS (sizeof(positions)/sizeof(USHORT))
/* The bitmap for each of the digits. */
static USHORT digits[10][7] = {
0x7, 0x5, 0x5, 0x5, 0x5, 0x5, 0x7, /* 0 */
0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, /* 1 */
0x7, 0x1, 0x1, 0x7, 0x4, 0x4, 0x7, /* 2 */
0x7, 0x1, 0x1, 0x7, 0x1, 0x1, 0x7, /* 3 */
0x5, 0x5, 0x5, 0x7, 0x1, 0x1, 0x1, /* 4 */
0x7, 0x4, 0x4, 0x7, 0x1, 0x1, 0x7, /* 5 */
0x7, 0x4, 0x4, 0x7, 0x5, 0x5, 0x7, /* 6 */
0x7, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, /* 7 */
0x7, 0x5, 0x5, 0x7, 0x5, 0x5, 0x7, /* 8 */
0x7, 0x5, 0x5, 0x7, 0x1, 0x1, 0x7 /* 9 */
};
static struct NewWindow New_Window = {
426, 0, 164, 10,
-1, -1,
CLOSEWINDOW,
WINDOWCLOSE | WINDOWDEPTH | WINDOWDRAG | SIMPLE_REFRESH | NOCAREREFRESH,
NULL, NULL,
(UBYTE *) "MouseClock ",
NULL, NULL, 0, 0, 0, 0,
WBENCHSCREEN
};
struct IntuitionBase *IntuitionBase = NULL;
extern struct IntuitionBase *OpenLibrary();
static struct Window *Window = NULL;
extern struct Window *OpenWindow();
static struct MsgPort *Msg_Port = NULL;
extern struct MsgPort *CreatePort();
static struct timerequest Timer_Request;
extern struct Task *FindTask();
extern struct IntuiMessage *GetMsg();
USHORT SetTime();
main()
{
BYTE old_hotX, old_hotY;
USHORT second, old_pointer[POINTERSIZE];
struct Preferences pref;
struct IntuiMessage *Msg;
SetTaskPri(FindTask(0L), -5L);
if ( (IntuitionBase = OpenLibrary("intuition.library", 0L)) == NULL )
finish(101, "Can't get intuition.\n");
if ( (Msg_Port = CreatePort("timer.port", 0L)) == NULL )
finish(102, "Can't create a timer port.\n");
if ( OpenDevice(TIMERNAME, (long) UNIT_VBLANK, &Timer_Request, 0L) != 0 )
finish(103, "Can't open a timer device.\n");
Timer_Request.tr_node.io_Message.mn_ReplyPort = Msg_Port;
Timer_Request.tr_node.io_Message.mn_Node.ln_Type = NT_MESSAGE;
Timer_Request.tr_node.io_Message.mn_Node.ln_Pri = 0;
Timer_Request.tr_node.io_Command = TR_ADDREQUEST;
if ( (Window = (struct Window *) OpenWindow(&New_Window)) == NULL )
finish(104, "Can't open a window.\n");
GetMouse(&old_pointer, &old_hotX, &old_hotY);
second = SetTime(&Clock, NUMPOS, &positions);
SetMouse(&Clock, CLOCK_HOT_X, CLOCK_HOT_Y);
for ( ; ; ) {
Timer_Request.tr_time.tv_secs = 60 - second + 5;
Timer_Request.tr_time.tv_micro = 0;
SendIO(&Timer_Request.tr_node);
Wait(1L << Window->UserPort->mp_SigBit |
1L << Msg_Port->mp_SigBit);
while ( (Msg = GetMsg(Window->UserPort)) != 0 ) {
if ( Msg->Class == CLOSEWINDOW ) {
ReplyMsg(Msg);
SetMouse(&old_pointer, old_hotX, old_hotY);
finish(0, "");
}
ReplyMsg(Msg);
}
GetMsg(Msg_Port);
second = SetTime(&Clock, NUMPOS, &positions);
SetClock(&Clock, NUMPOS, &positions);
}
}
finish(code, msg)
int code;
char *msg;
{
AbortIO(&Timer_Request.tr_node);
if ( Window != NULL )
CloseWindow(Window);
if ( Timer_Request.tr_node.io_Message.mn_ReplyPort != NULL )
CloseDevice(&Timer_Request);
if ( Msg_Port != NULL )
DeletePort(Msg_Port);
if ( IntuitionBase != NULL )
CloseLibrary(IntuitionBase);
#ifdef PRINT_ERRORS
if ( msg[0] != '\0' )
fputs(msg, stderr);
#endif
exit(code);
}
/* Get the whole pointer matrix and the hot point offset. */
GetMouse(pointer, hotX, hotY)
register USHORT *pointer;
BYTE *hotX;
BYTE *hotY;
{
register int i;
struct Preferences pref;
Forbid();
GetPrefs(&pref, (long)sizeof(struct Preferences));
for ( i = 0; i < POINTERSIZE; i++ )
pointer[i] = pref.PointerMatrix[i];
*hotX = pref.XOffset;
*hotY = pref.YOffset;
Permit();
}
/* Set the current time in the pointer matrix. */
USHORT SetTime(pointer, numpos, pos)
register USHORT *pointer;
register USHORT numpos;
register USHORT *pos;
{
register int i;
struct DateStamp tnow;
USHORT hour10, hour1, min10, min1;
static USHORT hour10_old = 99;
static USHORT hour1_old = 99;
static USHORT min10_old = 99;
DateStamp(&tnow);
hour1 = (tnow.ds_Minute / 60) % 12;
hour1 = (hour1 == 0) ? 12 : hour1;
hour10 = hour1 / 10;
hour1 = hour1 % 10;
min1 = tnow.ds_Minute % 60;
min10 = min1 / 10;
min1 = min1 % 10;
if ( hour10_old != hour10 ) {
for ( i=0; i < numpos; i++ ) {
if ( hour10 == 1 )
pointer[pos[i]] |= 0x8000;
else
pointer[pos[i]] &= 0x7fff;
}
hour10_old = hour10;
}
if ( hour1_old != hour1 ) {
for ( i=0; i < numpos; i++ ) {
pointer[pos[i]] &= 0xc7ff;
pointer[pos[i]] |= (digits[hour1][i] << 11);
}
hour1_old = hour1;
}
if ( min10_old != min10 ) {
for ( i=0; i < numpos; i++ ) {
pointer[pos[i]] &= 0xff1f;
pointer[pos[i]] |= (digits[min10][i] << 5);
}
min10_old = min10;
}
for ( i=0; i < numpos; i++ ) {
pointer[pos[i]] &= 0xfff1;
pointer[pos[i]] |= (digits[min1][i] << 1);
}
return((USHORT)(tnow.ds_Tick/TICKS_PER_SECOND));
}
/* Set certain positions in the pointer matrix. */
SetClock(pointer, numpos, pos)
register USHORT *pointer;
register USHORT numpos;
register USHORT *pos;
{
register int i;
struct Preferences pref;
Forbid();
GetPrefs(&pref, (long)sizeof(struct Preferences));
for ( i = 0; i < numpos; i++ )
pref.PointerMatrix[pos[i]] = pointer[pos[i]];
SetPrefs(&pref, (long)sizeof(struct Preferences), FALSE);
Permit();
}
/* Set the whole pointer matrix and the hot point offset. */
SetMouse(pointer, hotX, hotY)
register USHORT *pointer;
BYTE hotX;
BYTE hotY;
{
register int i;
struct Preferences pref;
Forbid();
GetPrefs(&pref, (long)sizeof(struct Preferences));
for ( i = 0; i < POINTERSIZE; i++ )
pref.PointerMatrix[i] = pointer[i];
pref.XOffset = hotX;
pref.YOffset = hotY;
SetPrefs(&pref, (long)sizeof(struct Preferences), FALSE);
Permit();
}